package leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 一条基因序列由一个带有8个字符的字符串表示，其中每个字符都属于 "A", "C", "G", "T"中的任意一个。
 * 
 * 假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。
 * 
 * 例如，基因序列由"AACCGGTT" 变化至 "AACCGGTA" 即发生了一次基因变化。
 * 
 * 与此同时，每一次基因变化的结果，都需要是一个合法的基因串，即该结果属于一个基因库。
 * 
 * 现在给定3个参数 — start, end,
 * bank，分别代表起始基因序列，目标基因序列及基因库，请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化，请返回 -1。
 * 
 * 注意:
 * 
 * 起始基因序列默认是合法的，但是它并不一定会出现在基因库中。 所有的目标基因序列必须是合法的。 假定起始基因序列与目标基因序列是不一样的。
 * 
 * @author maodou38
 *
 */
public class Solution433_mime {
	int short_time = Integer.MAX_VALUE;

	public int minMutation(String start, String end, String[] bank) {
		List<String> codeFactory = new ArrayList(Arrays.asList(bank));
		if(codeFactory.size()==0||!codeFactory.contains(end))
			return -1;
		if (!codeFactory.contains(start)) {// 完善基因库
			codeFactory.add(start);
		}
		compare(start, end, codeFactory,new ArrayList<String>(),0);
		if(short_time==Integer.MAX_VALUE)
			short_time=-1;
		return short_time;
	}

	/**
	 * 
	 * @param start
	 * @param compared
	 * @param codeFactory
	 * @return
	 */
	public void compare(String start, String compared, List<String> codeFactory, List<String> comparedList,int times) {
		List<String> resultList = new ArrayList<String>();// 所有合法的基因序列的集合
		times++;
		flag: for (String str : codeFactory) {
			if (compared.equals(str)||comparedList.contains(str))
				continue;
			int count = 0;
			for (int i = 0; i < compared.length(); i++) {
				if (compared.charAt(i) != str.charAt(i)) {
					count++;
					if (count >= 2) {
						continue flag;
					}
				}

			}
			if (count != 1) {
				continue;
			}
			resultList.add(str);
		}
		comparedList.add(compared);
		if (resultList.contains(start)) {
			short_time = Math.min(times, short_time);
		} else {
			for (String compare : resultList) {
				compare(start, compare, codeFactory,comparedList,times);
			}
		}
	}

}
